#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>

const char *bin="mybin";

int main()
{
    printf("process is running...\n");
    pid_t id=fork();
    assert(id != -1);

    if(id == 0)
    {
        // 这里的替换，不会影响父进程
        // 类比：命令行怎么写，这里就怎么传
        // 这里有两个ls,重复吗？不重复，一个是告诉系统我要执行谁？一个是告诉系统，我想怎么执行
        //execlp("ls","ls","-l","-a","--color=auto",NULL);
        //execl("usr/bin/ls","ls","-l","-a","--color=auto",NULL);
        
       // char *const argv_[]={
       //     "ls",
       //     "-a",
       //     "-l",
       //     "--color=auto",
       //     NULL
       // };

       // //execv("usr/bin/ls",argv_);
       // execvp("ls",argv_);
       // execl("./mybin","mybin",NULL);
       
        char *const envp_[]={
            (char*)"MYENV=111222333444",
            NULL
        };
        //execle("./mybin","mybin",NULL,envp_);//自定义环境变量
        extern char** environ;
        putenv((char*)"MYENV=11112222333334444");// 将指定环境变量导入到系统中 environ指向的环境变量表
        execle("./mybin","mybin",NULL,environ);// 实际上，默认环境变量你不传，子进程也能获取

        exit(1);//must failde
    }
    
    int status=0;
    pid_t ret=waitpid(id,&status,0);
    if( ret > 0 )
    {
        printf("wait success: exit code: %d, sig: %d\n",((status >> 8) & 0xFF),status & 0x7F);
    }


    ////.c -> .exe -> load -> process -> 运行 -> 执行我们现在所写的代码
    //printf("process is running...\n");

    ////load -> exe
    ////只要是一个函数，调用就有可能失败，就是没有替换成功，就是没有替换
    //// exec*为什么没有成功返回值呢？因为成功了，就和接下来的代码无关了，判断毫无意义
    //// execl只要返回了，一定是错误了
    //execl("/usr/bin/lsabcdef"/*要执行哪一个程序*/,"ls",NULL/*你想怎么执行*/);  // all exec* of end NULL
    ////execl("/usr/bin/ls"/*要执行哪一个程序*/,"ls",NULL/*你想怎么执行*/);  // all exec* of end NULL
    //
    //perror("execl\n");

    //// 为什么这里的printf没有被执行了？printf也是代码，是在execl之后的，
    //// execl执行完毕的时候，代码已经全部覆盖，开始执行新程序的代码了，所以printf就无法执行了
    //printf("process running done...\n");
    //exit(1);
    return 0;
}
